package com.kira.scaffoldmvc.QLExpression;

import com.alibaba.qlexpress4.Express4Runner;
import com.alibaba.qlexpress4.InitOptions;
import com.alibaba.qlexpress4.QLOptions;

import java.util.HashMap;
import java.util.Map;

/**
 * QLExpress表达式引擎使用示例类
 * QLExpress是阿里巴巴开源的轻量级表达式引擎，用于动态执行字符串形式的表达式
 * 相比传统硬编码，它允许在运行时动态修改计算逻辑，适合业务规则频繁变动的场景
 */
public class QLExpressDemo {
    public static void main(String[] args) {
        // 创建表达式执行器实例（核心对象，负责解析和执行表达式）
        // InitOptions.DEFAULT_OPTIONS 采用默认初始化配置，包含基础语法支持和安全策略
        // Express4Runner是线程安全的，实际应用中建议单例模式复用，减少对象创建开销
        Express4Runner runner = new Express4Runner(InitOptions.DEFAULT_OPTIONS);

        // 创建上下文对象（用于存储表达式中需要用到的变量）
        // 上下文本质是键值对集合，变量名作为key，变量值作为value
        Map<String, Object> context = new HashMap<>();

        // 向上下文对象中添加变量（这些变量会在表达式中被引用）
        // 变量类型可以是基本类型、对象、集合等任意Java类型
        context.put("a", 1);   // 添加变量a，值为1
        context.put("b", 2);   // 添加变量b，值为2
        context.put("c", 3);   // 添加变量c，值为3

        // 定义需要执行的表达式字符串（支持数学运算、逻辑判断等）
        // QLExpress语法与Java表达式基本一致，支持+、-、*、/等运算符及优先级
        // 此处表达式为 "a + b * c"，按照数学优先级计算：1 + 2*3 = 7
        String express = "a + b * c";

        try {
            // 执行表达式并获取结果
            // 参数说明：
            // 1. express：待执行的表达式字符串
            // 2. context：变量上下文，提供表达式所需的变量值
            // 3. QLOptions.DEFAULT_OPTIONS：执行选项，包含超时设置、日志开关等
            // getResult() 从执行结果对象中提取计算结果
            Object result = runner.execute(express, context, QLOptions.DEFAULT_OPTIONS).getResult();

            // 输出表达式执行结果
            System.out.println(result); // 输出结果：7
        } catch (Exception e) {
            // 捕获并打印执行过程中可能出现的异常
            // 常见异常场景：表达式语法错误、引用未定义的变量、类型不匹配等
            e.printStackTrace();
        }
    }
}